package ar.edu.utn.frsf.tpae.a2012.g05.util;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.Random;

import ar.edu.utn.frsf.tpae.a2012.g05.entity.CajaAhorro;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cliente;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.CuentaCorriente;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Movimiento;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Pago;

public class EntityFactory {
	
	public static CajaAhorro getCajaAhorro() {
		CajaAhorro ca = new CajaAhorro();
		Random rnd = new Random();
		ca.setNumero(rnd.nextInt());
		ca.setCliente(null);
		ca.setFechaApertura(new Date());
		ca.setSaldoActual(new BigDecimal("123.45"));
		ca.setInteresMensual(0.2);
		ca.setMovimientos(new ArrayList<Movimiento>());
		return ca;
	}
	
	/**
	 * Metodo que retorna una cuenta corriente inicializada con un numero de cuenta aleatorio, 
	 * sin ningun cliente asociado y sin movimientos.
	 * 
	 * 
	 * @return
	 */
	public static CuentaCorriente getCuentaCorriente() {
		CuentaCorriente cc = new CuentaCorriente();
		Random rnd = new Random();
		cc.setNumero(rnd.nextInt());
		cc.setCliente(null);
		cc.setFechaApertura(new Date());
		cc.setSaldoActual(new BigDecimal("123.45"));
		cc.setCantMaxOpMensuales(10);
		cc.setCostoMantenimiento(30d);
		cc.setLimiteSaldoNegativo(1000d);
		cc.setInteresSaldoNegativo(12.5d);
		cc.setMovimientos(new ArrayList<Movimiento>());
		return cc;
	}
	/**
	 * Metodo que retorna un cliente con un numero de cuenta aleatoreo y sin cuentas.
	 * 
	 * @return cliente
	 */
	public static Cliente getCliente() {
		Cliente c = new Cliente();
		Random rnd = new Random();
		c.setNumero(Integer.toString(rnd.nextInt()));
		c.setNombre("Ignacio");
		c.setApellido("Sabbag");
		c.setDocumento("29220346");
		c.setCuil("20-29220346-3");
		c.setFechaAlta(new Date());
		c.setDireccionPostal("3018");
		c.setTelefono("4905123");
		c.setEmail("mail@mail.com");
		c.setCuentas(new ArrayList<Cuenta>());
		return c;
	}
	
	public static Movimiento getMovimiento() {
		Movimiento m = new Movimiento();
		m.setCuenta(null);
		m.setFecha(new Date());
		m.setMonto(new BigDecimal("123.00"));
		return m;
	}
	
	/**
	 * Retorna un nuevo pago sin asociar a ninguna cuenta.
	 * @return
	 */
	public static Pago getPago() {
		Pago p = new Pago();
		p.setCuenta(null);
		p.setFecha(new Date());
		p.setMonto(new BigDecimal("123.00"));
		p.setCodigo("112233");
		p.setComentario("algún comentario");
		return p;
	}
	
	/**
	 * Retorna un nuevo pago asociado a la cuenta.
	 * 
	 * @param cuenta asociada al pago
	 * @return un pago asociado a la cuenta
	 */
	public static Pago getPago(Cuenta cuenta) {
		Pago p = new Pago();
		p.setCuenta(cuenta);
		p.setFecha(new Date());
		p.setMonto(new BigDecimal("123.00"));
		p.setCodigo("112233");
		p.setComentario("algún comentario");
		return p;
	}
}
